package insieme;

public class Insieme {

    private int[] insieme;

    /**
     * Inizializza l'insieme prendendo in input la dimensione stessa dell'insieme. Sarà poi possibile settare ogni singolo elemento tramite la funzione setElement.
     * @param pDimensione La dimensione dell'insieme.
     */
    public Insieme(int pDimensione) {
        if(pDimensione>0){
            this.insieme = new int[pDimensione];
        }
    }

    /**
     * Inizializza l'insieme prendendo in input gli estremi di questo insieme. L'insieme viene già riempito con i numeri compresi tra i due numeri passati in input.
     * @param pNumero
     * @param pNumeroI
     */
    public Insieme(int pNumero, int pNumeroI) {
        if (pNumero < pNumeroI) {
            this.insieme = new int[pNumeroI - pNumero + 1];
            int i = 0;
            while (pNumero <= pNumeroI) {
                this.insieme[i] = pNumero;
                pNumero++;
                i++;
            }
        } else {
            this.insieme = new int[pNumero - pNumeroI + 1];
            int i = 0;
            while (pNumeroI <= pNumero) {
                this.insieme[i] = pNumeroI;
                pNumeroI++;
                i++;
            }
        }
    }

    /**
     * Funzione per prelevare l'insieme.
     * @return Un array di interi consistente nell'insieme.
     */
    public int[] toArray() {
        return this.insieme;
    }

    /**
     * Consente di sapere l'iesimo elemento dell'insieme.
     *
     * Esempio: Dato l'insieme {1,2,6,4,5,8,7}, dando in input 3 si avrà come valore di ritorno 6
     * @param pNum La posizione dell'elemento.
     * @return Un intero.
     */
    public int getElement(int pNum) {
        pNum--;
        return this.insieme[pNum];
    }

    /**
     * Consente di sapere la dimensione dell'insieme.
     * @return Un intero contenente la dimensione dell'insieme.
     */
    public int getDimensione() {
        return this.insieme.length;
    }

    /**
     * Questa funzione ci permette di cambiare la dimensione dell'insieme per aggiungere altri elementi all'insieme (tramite il metodo setElement), in caso la dimensione passata in input sia minore della dimensione attuale dell'insieme quest'ultimo verrà troncato.
     * @param pDimensione la nuova dimensione dell'insieme.
     * @return true in caso la modifica riesca, false nel caso fallisca.
     */
    public boolean changeDimensione(int pDimensione) {
        if (pDimensione > 0) {
            int[] swap = new int[this.insieme.length];
            for (int i = 0; i < swap.length; i++) {
                swap[i] = this.insieme[i];
            }
            this.insieme = new int[pDimensione];
            for (int i = 0; i < this.insieme.length; i++) {
                this.insieme[i] = swap[i];
            }
            return true;
        }
        return false;
    }

    /**
     * Consente di settare un elemento dell'insieme.
     *
     * Esempio: dato l'insieme {1,2,3,4,5,6,7} passando come valore di pNum 1 e come valore di pValore 8 l'insieme risultante sarà {8,2,3,4,5,6,7}.
     * @param pNum La posizione del numero che si vuole modificare.
     * @param pValore Il valore col quale si vuole sostituire un elemento dell'insieme.
     * @return true nel caso l'operazione riesca, false nel caso l'operazione fallisca.
     */
    public boolean setElement(int pNum, int pValore) {
        pNum--;
        if (pNum < this.insieme.length) {
            this.insieme[pNum] = pValore;
            return true;
        }
        return false;
    }

    /**
     * Setta tutti gli elementi dell'insieme al valore di default (0)
     */
    public void empty() {
        for (int i = 0; i < this.insieme.length; i++) {
            this.insieme[i] = 0;
        }
    }

    /**
     * Consente di ottenere il valore massimo all'interno dell'insieme.
     * @return Un intero contenente il massimo valore.
     */
    public int getMax() {
        int max = 0;
        for (int i = 0; i < this.insieme.length; i++) {
            if (this.insieme[i] > max) {
                max = this.insieme[i];
            }
        }
        return max;
    }

    /**
     * Consente di ottenere il valore minimo all'interno dell'insieme.
     * @return Un intero contenente il minimo valore.
     */
    public int getMin() {
        int min = this.getMax();
        for (int i = 0; i < this.insieme.length; i++) {
            if (this.insieme[i] < min) {
                min = this.insieme[i];
            }
        }
        return min;
    }
}
